package controller;

import model.FileModel;
import user.sendPanel;

import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class SendFile {
    private FileModel fileModel;
    public SendFile(FileModel fileModel) throws FileNotFoundException {
         this.fileModel=fileModel;
         beginSend();

    }




    public void beginSend() {
        File file=fileModel.getFile();
        String ip=fileModel.getIp();
        //创建一个新线程,提高传输效率
        new Thread(new Runnable() {
            FileInputStream openFile;
            @Override
            public void run() {
                try {
                        try{
                            openFile = new FileInputStream(file);//本地创建文件输入流
                        }catch (Exception e){
                            System.out.println("文件无法打开");
                            JOptionPane.showMessageDialog(null,"文件无法被使用!请检查是否被占用");
                            openFile=null;

                        }
                        if (openFile==null){
                            sendPanel.getBtnSendFile().setEnabled(true);
                        }else{
                            Socket socket = new Socket(ip, 9999);//创建socket隧道
                            FileOutputStream outFile = (FileOutputStream)socket.getOutputStream();//输出流是套在Scoket隧道上的,用隧道的接收流来接受主机的输出流

                            //***************************传送文件名(文本消息)*************************
                            //先转化为byte数组之后 然后发送
                            byte type[] = file.getName().getBytes("GBK");
                            outFile.write(type);
                            //***************************传送文件名(文本消息)*************************


                            //***********************传输文件************************
                            //开始传送
                            sendPanel.getTextTip().setText("正在传输....");
                            byte[] b = new byte[1024];//缓冲区,用于存放数据,补齐为1024byte
                            int n = openFile.read(b);//开始读入,如果读完了则-1
                            Date start=new Date();
                            while (n != -1) {
                                outFile.write(b, 0, n);//远程主机开始写入数据
                                n = openFile.read(b);//从缓冲区读入新的数据
                            }
                            Date end=new Date();
                            //***********************传输文件************************


                            float time=(end.getTime()-start.getTime())/1000;
                            System.out.println("Send:传输完毕  耗时:"+ time+ "秒  平均速度:"+fileModel.getSize()/time+" MB/S");
                            sendPanel.getBtnSendFile().setEnabled(true);
                            sendPanel.getTextTip().setText("传输完毕  耗时:"+ time+ "秒  平均速度:"+fileModel.getSize()/time+" MB/S");
                            //关闭流
                            outFile.close();
                            socket.close();
                            openFile.close();
                        }
                }catch (Exception e){
                    e.printStackTrace();
                    sendPanel.getBtnSendFile().setEnabled(true);
                    JOptionPane.showMessageDialog(null,"对方未运行该软件的接收功能!");
                    sendPanel.getTextTip().setText("对方未运行本软件,传输失败...");
                }
            }
        }).start();

    }


}




